﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModel.h"
#include <string>
#include <vector>

namespace gcmp
{
    class IDocument;

    /// \brief 在事务中报错时可选用的错误类型，严重性依次从小到大.
    enum class GCMP_MODEL_EXPORT TransactionErrorType : int32_t
    {
        Invalid = 0,   // 无效状态
        Message = 1,   // 提示性信息， 可忽略
        Warning = 2,   // 警告
        Error   = 3,   // 错误
        DataCorruption = 4, //数据出现异常， 建议回滚后保存文件重新打开
        Crash   = 5    // 程序崩溃，建议打开上次保存的文件
    };
    
    /// \brief 事务发生错误时的描述对象接口
    /// 
    /// 当事务发生错误时， 可通过UserTransactionUtils::PostError将错误对象注册到平台中
    class GCMP_MODEL_EXPORT ITransactionError
    {
    public:
        /// \brief 创建一个默认的事务错误描述对象
        /// \param errorType 错误类型 \see TransactionErrorType
        /// \param message 错误描述信息 
        /// \return OwnerPtr<ITransactionError> 创建出来的错误描述对象
        static OwnerPtr<ITransactionError> CreateGeneralError(TransactionErrorType errorType, const std::wstring& errorMessage);

    public:
        /// \brief 获取错误类型
        /// \see TransactionErrorType
        /// \return TransactionErrorType  错误类型
        virtual TransactionErrorType GetErrorType() const = 0;

        /// \brief 获取错误信息
        /// \return std::wstring 错误信息
        virtual std::wstring GetErrorMessage() const = 0;

        /// \brief 获取事务错误描述id
        /// \return Int64 事务错误描述id
        virtual Int64 GetId() const = 0;

        /// \brief 设置出错的对象Id
        /// \param failureElements
        virtual void SetFailureElements(const std::vector<ElementId> & failureElements) = 0;

        /// \brief 获取出错的对象Id
        /// \return 出错的对象Id
        virtual const std::vector<ElementId> & GetFailureElements() const = 0;

        /// \brief 析构函数
        virtual ~ITransactionError() {}
    };
}

